import plotly.graph_objects as go
import numpy as np
import pandas as pd
# load in the hierarchy information
multilevel_lookup = pd.read_csv("https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt", sep="\t").drop(['Level5'], axis=1)
multilevel_lookup = multilevel_lookup.rename(columns={
"modify": "roi",
"modify.1": "level4",
"modify.2": "level3",
"modify.3": "level2",
"modify.4": "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]
print(multilevel_lookup.head())
# Now load in the subject data
id = 127
subjectData = pd.read_csv("https://raw.githubusercontent.com/smart-stats/ds4bio_book/main/book/assetts/kirby21AllLevels.csv")
print(subjectData.head())
roi level4 level3 level2 level1
0 SFG_L SFG_L Frontal_L CerebralCortex_L Telencephalon_L
1 SFG_R SFG_R Frontal_R CerebralCortex_R Telencephalon_R
2 SFG_PFC_L SFG_L Frontal_L CerebralCortex_L Telencephalon_L
3 SFG_PFC_R SFG_R Frontal_R CerebralCortex_R Telencephalon_R
4 SFG_pole_L SFG_L Frontal_L CerebralCortex_L Telencephalon_L
Unnamed: 0 rawid roi volume min max \
0 1 kirby127a_3_1_ax.img Telencephalon_L 531111 0.0 374.0
1 2 kirby127a_3_1_ax.img Telencephalon_R 543404 0.0 300.0
2 3 kirby127a_3_1_ax.img Diencephalon_L 9683 15.0 295.0
3 4 kirby127a_3_1_ax.img Diencephalon_R 9678 10.0 335.0
4 5 kirby127a_3_1_ax.img Mesencephalon 10268 55.0 307.0
mean std type level id icv tbv
0 128.3013 51.8593 1 1 127 1378295 1268519
1 135.0683 53.6471 1 1 127 1378295 1268519
2 193.5488 32.2733 1 1 127 1378295 1268519
3 193.7051 32.7869 1 1 127 1378295 1268519
4 230.8583 29.2249 1 1 127 1378295 1268519
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == id)]
subjectData = subjectData[['roi', 'volume']]
## Merge the subject data with the multilevel data
subjectData = pd.merge(subjectData, multilevel_lookup, on="roi")
subjectData = subjectData.assign(icv="ICV")
subjectData = subjectData.assign(comp=subjectData.volume / np.sum(subjectData.volume))
# prepare data for sankey diagram
labels = np.append(subjectData['roi'].unique(), subjectData['level1'].unique())
label_indexes = {k: v for v, k in enumerate(labels)}
subjectData = subjectData.replace({'roi': label_indexes})
subjectData = subjectData.replace({'level1': label_indexes})
print(subjectData.head())
fig = go.Figure(data=[go.Sankey(
valueformat=".0f",
valuesuffix="TWh",
# Define nodes
node=dict(
pad=15,
thickness=15,
line=dict(color="black", width=0.5),
label=labels
),
# Add links
link=dict(
source=subjectData['roi'],
target=subjectData['level1'],
value=subjectData['volume']
))])
fig.update_layout(title_text="Test",
font_size=10)
#fig.write_html("sankey.html")
fig.show()
roi volume level4 level3 level2 level1 icv comp 0 0 12926 SFG_L Frontal_L CerebralCortex_L 274 ICV 0.009350 1 1 10050 SFG_R Frontal_R CerebralCortex_R 275 ICV 0.007270 2 2 12783 SFG_L Frontal_L CerebralCortex_L 274 ICV 0.009247 3 3 11507 SFG_R Frontal_R CerebralCortex_R 275 ICV 0.008324 4 4 3078 SFG_L Frontal_L CerebralCortex_L 274 ICV 0.002227
import plotly.graph_objects as go
import numpy as np
import pandas as pd
# load in the hierarchy information
multilevel_lookup = pd.read_csv("https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt", sep="\t").drop(['Level5'], axis=1)
multilevel_lookup = multilevel_lookup.rename(columns={
"modify": "roi",
"modify.1": "level4",
"modify.2": "level3",
"modify.3": "level2",
"modify.4": "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]
# print(multilevel_lookup.head())
# Now load in the subject data
id = 127
subjectData = pd.read_csv("https://raw.githubusercontent.com/smart-stats/ds4bio_book/main/book/assetts/kirby21AllLevels.csv")
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == id)]
subjectData = subjectData[['roi', 'volume']]
## Merge the subject data with the multilevel data
subjectData = pd.merge(subjectData, multilevel_lookup, on="roi")
subjectData = subjectData.assign(icv="ICV")
subjectData = subjectData.assign(comp=subjectData.volume / np.sum(subjectData.volume))
# prepare data for sankey diagram
sankeyData = pd.DataFrame(columns=['source', 'target', 'comp'])
columns = ['icv', 'level1', 'level2']
for s in range(len(columns)):
for t in range(s + 1, len(columns)):
sankeyData = sankeyData.append(subjectData[[columns[s], columns[t], 'comp']] \
.groupby([columns[s], columns[t]]).mean().reset_index() \
.rename(columns={columns[s]: 'source', columns[t]: 'target'}))
labels = np.array(['ICV'])
for c in columns[1:]:
labels = np.append(labels, subjectData[c].unique())
# label => index map
label_indexes = {k: v for v, k in enumerate(labels)}
# replace labels with indexes
sankeyData = sankeyData.replace({'source': label_indexes})
sankeyData = sankeyData.replace({'target': label_indexes})
print(sankeyData.head())
fig = go.Figure(data=[go.Sankey(
valueformat=".0f",
# Define nodes
node=dict(
pad=15,
thickness=15,
line=dict(color="black", width=0.5),
label=labels
),
# Add links
link=dict(
source=sankeyData['source'],
target=sankeyData['target'],
value=sankeyData['comp']
))])
fig.update_layout(title_text="Sankey Diagram",
font_size=10)
fig.write_html("sankey.html")
fig.show()
source target comp 0 0 8 0.002482 1 0 3 0.001069 2 0 4 0.001045 3 0 5 0.000929 4 0 6 0.005766
/var/folders/ks/9bt48sw176x42y_3jfv52tx00000gn/T/ipykernel_55114/3293489617.py:33: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead. /var/folders/ks/9bt48sw176x42y_3jfv52tx00000gn/T/ipykernel_55114/3293489617.py:33: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead. /var/folders/ks/9bt48sw176x42y_3jfv52tx00000gn/T/ipykernel_55114/3293489617.py:33: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.